﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CROSLAND.BL.BE
{
    public class DetalleBE
    {
        //private decimal _igvValor = 19m;

        public DetalleBE()
        {
            this._cantidad = 0m;
            this._cantComp = 0m;
            this._cantConfirmada = 0m;
            
            //this._fechaEntrega = DateTime.Today;
            this._fechaCantConf = new DateTime();

            this._precio = new DescuentoBE(); this._precio.Condicion = "ZP01";
            this._igv = new DescuentoBE(); this._igv.Condicion = "MWST";
            this._repartos = new List<RepartoBE>();
            //RepartoBE x = new RepartoBE(); x.FechaEntrega = this._fechaEntrega; x.CantPed = this._cantidad;
            this._repartos.Add(new RepartoBE());

            this.Material = new MaterialBE();
            this.PosSup = "00";

            this._motivoRechazo = string.Empty;
            this._dsctoMontTotal = 0m;
            this._cambAlmacen = false;

            this.LstCond = new List<DescuentoBE>();

            this.Textos = new List<TextoBE>();
        }

        //********************************
        //Cotizacion VMS

        private List<TextoBE> _textos;

        public List<TextoBE> Textos
        {
            get { return _textos; }
            set { _textos = value; }
        }

        public string color { get; set; }
        public string anniofab { get; set; }
        public string anniomod { get; set; }
        //********************************

        private List<DescuentoBE> _lstCond;
        /// <summary>
        /// Lista de condiciones
        /// </summary>
        public List<DescuentoBE> LstCond
        {
            get { return _lstCond; }
            set { _lstCond = value; }
        }

        private string _tipoPosAnt;
        public string TipoPosAnt
        {
            get { return _tipoPosAnt; }
            set { _tipoPosAnt = value; }
        }
        private string _Reembolsable;
        public string Reembolsable
        {
            get { return _Reembolsable; }
            set { _Reembolsable = value; }
        }
        
        private decimal _dsctoMontTotal;
        public decimal DsctoMontTotal
        {
            get { return _dsctoMontTotal; }
            set { _dsctoMontTotal = value; }
        }

        public string ContentID
        {
            get { return this.PosicionCorto + this.CodMaterialCorto; }
        }

        public string DescMovil
        {
            get 
            { 
                //rgutierrez 16.12.2011
                return PosicionCorto + " - " + CodMaterialCorto + " " + DescMaterial.PadRight(40,'_') + " - " + Cantidad + " - " + Total;
                //return this.PosicionCorto + " - " + this.CodMaterialCorto + " " + this.DescMaterial + " - " + this.Cantidad + " - " + this.Total; 
            }
        }

        private MaterialBE _material;

        public MaterialBE Material
        {
            get { return _material; }
            set { _material = value; }
        }

        private string _codMaterial;

        /// <summary>
        /// string 18
        /// </summary>
        public string CodMaterial
        {
            get { return _codMaterial; }
            set { _codMaterial = value; }
        }

        public string CodMaterialCorto
        {
            get
            {
                if (_codMaterial.Trim() == "") //rgutierrez 31.01.2012
                    return "";
                else
                    return _codMaterial.Trim(); 
            }
        }

        private string _descMaterial;

        public string DescMaterial
        {
            get { return _descMaterial; }
            set { _descMaterial = value; }
        }

        //rgutierrez 03.02.2012
        public string DescMaterialTicketera
        {
            get
            {
                if (_descMaterial.Length > 35)
                    return _descMaterial.Substring(0, 35);
                else
                    return _descMaterial;
            }
        }

        private decimal _cantidad;

        public decimal Cantidad
        {
            get { return decimal.Round(_cantidad, 3); }
            set { _cantidad = value; }
        }

        private decimal _cantComp;
        /// <summary>
        /// cantidad de componente (para kits y combos)
        /// </summary>
        public decimal CantComp
        {
            get { return _cantComp; }
            set { _cantComp = value; }
        }

        private string _codUMedida;

        public string CodUMedida
        {
            get { return _codUMedida; }
            set { _codUMedida = value; }
        }

        //--- precios:
        public decimal PrecioUnitario
        {
            get { return this.Precio.Importe; }
        }

        public decimal PrecioTotal
        {
            get
            {
                return this.Precio.Valor > 0m ? decimal.Round(this.Precio.Valor, 2) : decimal.Round(this.Precio.Importe * Cantidad, 2);
            }
        }

        public decimal Total
        {
            get { return decimal.Round(this.SubTotal + this.IgvTotal, 2); }
        }

        public decimal IgvUnitario
        {
            get { return (this.Igv.Importe > 100 ? this.Igv.Importe / 10 : this.Igv.Importe); }
        }

        public decimal IgvTotal
        {
            //rgutierrez 02.12.2011 No estaba considerando la diferencia ZP01 en una Nota de credito Z021
           // get { return this.Igv.Valor; }
            get { return decimal.Round(this.IgvUnitario * this.SubTotal / 100, 2); }
        }

        /// <summary>
        /// Total condiciones - precio
        /// </summary>
        public decimal TotalDctos
        {
            get
            {
                decimal totCond = 0m;
                foreach (DescuentoBE itm in this._lstCond)
                {
                    if (itm.Valor != this.Precio.Valor) 
                    {
                        //if (itm.Condicion == "YR01" || itm.Condicion == "YR02" || itm.Condicion == "YR03")
                        //{
                            totCond += itm.Valor * Cantidad; //22.01.2013 MTEJADA
                        //}
                        //else {
                        //    totCond += itm.Valor;
                        //}
                    }
                }
                return decimal.Round(totCond, 2, MidpointRounding.AwayFromZero);
                //decimal totCond = decimal.Round(this._lstCond.Sum(X => X.Valor), 2, MidpointRounding.AwayFromZero);
                //return decimal.Round(totCond - this.Precio.Valor, 2, MidpointRounding.AwayFromZero);
            }
        }

        public decimal SubTotal
        {
            get
            {
                //return decimal.Round(this.PrecioTotal + Math.Abs(this.TotalDctos), 2);

                return decimal.Round(this.PrecioTotal + this.TotalDctos, 2);
            }
        }
        //------------------------------------------

        private DescuentoBE _igv;

        public DescuentoBE Igv
        {
            get { return _igv; }
            set { _igv = value; }
        }

        private DescuentoBE _precio;

        public DescuentoBE Precio
        {
            get { return _precio; }
            set { _precio = value; }
        }

        //------------------------------------------
        //private DateTime _fechaEntrega;
        /// <summary>
        /// 1era fecha de reparto
        /// </summary>
        //public DateTime FechaEntrega
        //{
        //    get { return _repartos.Count > 0 ? _repartos[0] : DateTime.Today; }
        //    //get { return _fechaEntrega; }
        //    //set { _fechaEntrega = value; }
        //}

        public string FechaEntregaString
        {
            get { return _repartos.Count > 0 ? _repartos[0].FechaEntrega.ToString("dd/MM/yyyy") : (new DateTime()).ToString("dd/MM/yyyy"); }
        }

        private string _prioridadEntrega;

        public string PrioridadEntrega
        {
            get { return _prioridadEntrega; }
            set { _prioridadEntrega = value; }
        }

        public string Reparto
        {
            get { return PrioridadEntrega + " " + (_repartos.Count > 0 ? _repartos[0].FechaEntrega.ToString("dd/MM/yy") : (new DateTime()).ToString("dd/MM/yy")); }
        }

        private decimal _cantConfirmada;

        public decimal CantConfirmada
        {
            get { return _cantConfirmada; }
            set { _cantConfirmada = value; }
        }

        private DateTime _fechaCantConf;

        public DateTime FechaCantConf
        {
            get { return _fechaCantConf; }
            set { _fechaCantConf = value; }
        }

        public string FechaCantConfStr
        {
            get { return (_fechaCantConf == new DateTime() ? "-" : _fechaCantConf.ToString("dd/MM/yyyy")); }
        }
        //-------------------------------------------

        private string _codCentro;//char4

        public string CodCentro
        {
            get { return _codCentro; }
            set { _codCentro = value; }
        }

        private bool _cambAlmacen;//char4

        public bool CambAlmacen
        {
            get { return _cambAlmacen; }
            set { _cambAlmacen = value; }
        }

        private string _codAlmacen;//char4

        public string CodAlmacen
        {
            get { return _codAlmacen; }
            set { _codAlmacen = value; }
        }

        private string _codLote;//char10

        public string CodLote
        {
            get { return _codLote; }
            set { _codLote = value; }
        }

        private string _posicion;

        public string Posicion
        {
            get { return _posicion.PadLeft(6, '0'); }
            set { _posicion = value; }
        }

        private string _posSup;

        public string PosSup
        {
            get { return _posSup.PadLeft(6, '0'); }
            set { _posSup = value; }
        }

        public string PosicionCorto
        {
            get { return _posicion.TrimStart('0'); }
        }
        public string PosSupCorto
        {
            get { return _posSup.TrimStart('0'); }
        }

        private decimal _peso;

        public decimal Peso
        {
            get { return _peso; }
            set { _peso = value; }
        }

        public decimal PesoNeto
        {
            get { return decimal.Round(_peso * _cantidad, 3); }
        }

        //-----------

        private string _uMedidaRendimiendo;
        /// <summary>
        /// MEINH: Unidad medida para visualización
        /// </summary>
        public string UMedidaRendimiendo
        {
            get { return _uMedidaRendimiendo; }
            set { _uMedidaRendimiendo = value; }
        }

        private decimal _valorRendimiento;
        /// <summary>
        /// UMREZ: Contador para la conversión en unidades de medida base
        /// </summary>
        public decimal ValorRendimiento
        {
            get { return decimal.Round(_valorRendimiento, 3); }
            set { _valorRendimiento = value; }
        }

        /// <summary>
        /// concatena el valor del rendimiento con la unidad.
        /// </summary>
        public string Rendimiento
        {
            get { return (ValorRendimiento != 0m ? ValorRendimiento.ToString() + " " + UMedidaRendimiendo : "-"); }
        }

        private string _tipoMaterial;

        /// <summary>
        /// NA = Nacional
        /// IM = Importado
        /// </summary>
        public string TipoMaterial
        {
            get { return _tipoMaterial; }
            set { _tipoMaterial = value; }
        }

        private string _codGrupoMat;

        public string CodGrupoMat
        {
            get { return _codGrupoMat; }
            set { _codGrupoMat = value; }
        }

        private string _motivoRechazo;

        public string MotivoRechazo
        {
            get { return _motivoRechazo; }
            set { _motivoRechazo = value; }
        }

        //------------------------------
        //--- campos para la impresión:
        private decimal _precioSinIGV;

        public decimal PrecioSinIGV
        {
            get { return decimal.Round(_precioSinIGV, 2); }
            set { _precioSinIGV = value; }
        }

        public decimal PrecioConIGV
        {
            get { return decimal.Round(this.PrecioSinIGV + (this.PrecioSinIGV * this.IgvUnitario / 100), 2); }
        }

        private decimal _totalImpresion;

        public decimal TotalImpresion
        {
            get { return decimal.Round(_totalImpresion, 2); }
            set { _totalImpresion = value; }
        }

        private string _tipoPosicion;
        /// <summary>
        /// Tipo de posición para Kits y Combos [z012 y z017]
        /// </summary>
        public string TipoPosicion
        {
            get { return _tipoPosicion; }
            set { _tipoPosicion = value; }
        }

        private List<RepartoBE> _repartos;

        public List<RepartoBE> Repartos
        {
            get { return _repartos; }
            set { _repartos = value; }
        }

        //rgutierrez 15.11.2011
        public string ConversionUMedida
        {
            get {
                if (_valorRendimiento == 0)
                {
                    return "";
                }
                else
                {
                    return Math.Round(_cantidad / _valorRendimiento).ToString() + ' ' + _uMedidaRendimiendo; 
                }
            }
        }

        public List<GenericBE> lstCentros { get; set; }
        public List<GenericBE> lstAlmacen { get; set; }
        public List<GenericBE> lstLotes { get; set; }
        public string JerarquiaPrincipalDesc { get; set; }
        public string codstatus { get; set; }
        public string PuestoExp { get; set; }
    }
}
